package main

import (
	"fmt"
)

type EmptyInterface interface {
}

type Course struct {
	name  string
	price string
}

// 以文件上传举例
type Alioss struct {
}
type LocalFile struct {
}

func store(x interface{}) {
	switch v := x.(type) {
	case Alioss:
		// 此处诊断阿里云储存做特殊处理
		fmt.Println(v)
	case LocalFile:
		// 此处针对本地保存做处理
		fmt.Println(v)
	}
}

// 空接口应用 通用打印函数
// func printit(i interface{}) {
// 	v, ok := i.(int) //类型断言
// 	if ok {
// 		// i是int类型
// 		fmt.Printf("%d(整数)", v)
// 	}
// 	// 以上if可以简写
// 	if s, ok := i.(string); ok {
// 		fmt.Printf("%s(字符串)", s)
// 	}
// 	fmt.Printf("%v\n", i)
// }
// 空接口应用 通用打印函数 使用swicth改造 switch中不需要break go会自动处理
func printit(i interface{}) {
	switch v := i.(type) {
	case string:
		fmt.Printf("%s(字符串)", v)
	case int:
		fmt.Printf("%d(整数)", v)
	default:
		fmt.Printf("%v\n", v)
	}

}
func main() {
	// 空接口
	var i interface{} // 空接口 相当于上面定义的 EmptyInterface
	//空接口可以类似于java和python中的object 可以赋值给空接口变量
	i = Course{} // 空接口i可以赋值给 Course

	// 下面赋值打印类似动态语言的感觉
	i = 10
	printit(i)
	i = "zhangsan"
	printit(i)
	i = []string{"django", "scrapy"}
	printit(i)

	// 空接口可以作为map的值 这样map就可以随意类型赋值了
	var teacherInfo = make(map[string]interface{})
	teacherInfo["name"] = "zhangsan"
	teacherInfo["age"] = 18
	teacherInfo["weight"] = 17.2
	fmt.Println(teacherInfo)
	// 类型的断言
	// 接口的一个坑 接口一般以er结尾 编码规范

}
